package com.t2t.top.interceptor.log;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;

//声明切面
//把类交给Spring管理
@Aspect
@Service
public class ServiceCheckWeb {

    private static final Logger logger = LoggerFactory.getLogger(ServiceCheckWeb.class);

    @Pointcut("execution(* com.t2t.top.service.impl.*.*(..))")// 切入点表达式
    private void anyMethod() {
    }

    //定义前置通知 执行业务方法前执行 args(userName) 表示要执行的方式必须为一个参数并为Person类型.这样就给他再加了限制条件
    @Before("anyMethod()&& args(userName)")
    public void doAccessCheck(String userName) {
        System.out.println(userName);//得到输入的参数  
        System.out.println("执行前置通知");
        logger.info("aopa");
    }

    //定义后置通知 执行完业务方法后执行 如果例外通知执行，那么它不会执行
    @AfterReturning(pointcut = "anyMethod()")
    public void doReturnCheck() {
        System.out.println("执行后置通知");
        logger.info("aopa");
    }

    //定义最终通知 finally里执行的通知
    @After("anyMethod()")
    public void doReleaseAction() {
        System.out.println("执行最终通知");
        logger.info("aopa");
    }

    //定义例外通知
    @AfterThrowing(pointcut = "anyMethod()", throwing = "ex")
    public void doExceptionAction(Exception ex) {
        System.out.println("执行例外通知");
        logger.info("aopa");
    }

    //环绕通知 doBasicProfiling  pjp可以修改  用于权限
    @Around("anyMethod()")
    public Object doBasicProfiling(ProceedingJoinPoint pjp) throws Throwable {
        System.out.println("执行环绕通知");
        Object value = pjp.proceed();
        System.out.println("退出环绕通知");
        logger.info("aopa");
        return value;
    }


}  